/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package controlador;


import dao.ArquivoJpaController;
import dao.PastaJpaController;
import dominio.ArquivoMd;
import dominio.PastaMd;
import java.io.File;
import java.security.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemHeaders;
import util.Controlador;
import util.NivelAcesso;
import util.Resposta;
import util.Seguranca;


/**
 *
 * @author devair
 */
public class AcervoCt extends Controlador{

    private PastaJpaController daoPasta;
    private ArquivoJpaController daoArquivo;
    
    public AcervoCt(HttpServletRequest request, HttpServletResponse response, ServletContext contexto) {
        super(request, response, contexto);
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("intranetJPU");
        this.daoArquivo = new ArquivoJpaController(emf);
        this.daoPasta = new PastaJpaController(emf);
    }       
    
    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void home(){
        listar();
    }
    
    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void listar() {
        List<PastaMd>pastas = daoPasta.findPastaRootEntities();
                
      
        this.resposta.adicionarAtributo("pastas", pastas, Resposta.EscopoAtributo.requisicao);        
        this.resposta.definirResposta("visao/acervo.jsp", Resposta.TipoResposta.encaminhamento);
    }
    
    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void listarArquivo() {
        
        //List<PastaMd> pastas = daoPasta.findPasta(Long.parseLong(this.getParameterValue("id"))).getPastaMds();
        List<ArquivoMd>arquivos = daoArquivo.findArquivoPastaEntities(Long.parseLong(this.getParameterValue("id")));
      
        //this.resposta.adicionarAtributo("pastas", pastas, Resposta.EscopoAtributo.requisicao);        
        this.resposta.adicionarAtributo("arquivos", arquivos, Resposta.EscopoAtributo.requisicao);        
        this.resposta.definirResposta("visao/json-arquivo.jsp", Resposta.TipoResposta.encaminhamento);
    }
    
    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void carrega() {        
        long id = Long.parseLong(this.getParameterValue("id"));        
        FileItem fi = this.getUploadedFile("file");
        
        if (fi != null && fi.getSize() > 0) {
            ArquivoMd arquivo = new ArquivoMd();
            PastaMd pasta = daoPasta.findPasta(id);
            String path = this.contexto.getRealPath(this.contexto.getInitParameter("file-upload")) + "/";
            try {
                File file;
                                                
                String fileName = String.valueOf(Calendar.getInstance().getTimeInMillis());
                String fileNamBD =fi.getName();
                String relativeFileName;
                if (fileName.lastIndexOf("\\") >= 0) {
                    file = new File(path + fileName.substring(fileName.lastIndexOf("\\")));
                    relativeFileName = this.contexto.getInitParameter("file-upload") + "/" + fileName.substring(fileName.lastIndexOf("\\"));
                } else {
                    file = new File(path + fileName.substring(fileName.lastIndexOf("\\") + 1));
                    relativeFileName = this.contexto.getInitParameter("file-upload") + "/" + fileName.substring(fileName.lastIndexOf("\\") + 1);
                }
                fi.write(file);
                
                arquivo.setNome(fileNamBD);
                arquivo.setCaminho(fileName);
                arquivo.setPasta(pasta);
                arquivo.setDataCriacao(new Date());                                            
                daoArquivo.create(arquivo);
                this.resposta.definirResposta("visao/json-arquivo.jsp", Resposta.TipoResposta.encaminhamento);
                //pasta.setCaminho(relativeFileName);
            } catch (Exception e) {
                this.resposta.adicionarErro("pasta", e.getMessage());
            }
        }       
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void excluir() {
        Long id = Long.parseLong(this.getParameterValue("id"));
        try {
            daoPasta.destroy(id);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        this.resposta.definirResposta("listar", Resposta.TipoResposta.redirecionamento);
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void incluir() {
        this.resposta.adicionarAtributo("pasta", new PastaMd(), Resposta.EscopoAtributo.requisicao);                
        this.resposta.definirResposta("visao/pastaCadastro.jsp", Resposta.TipoResposta.encaminhamento);
    }

    public void padrao() {
        this.resposta.definirResposta("visao/naoautorizado.html", Resposta.TipoResposta.encaminhamento);
    }
    
}
